package com.syf.kit.core.dao.sql;

import com.github.pagehelper.PageInfo;

import java.util.List;
import java.util.Map;

/***
 * 通过jdbc实现的数据库操作工具类
 * */
public interface SQLProcessor {

    /**
     * 获取当前数据源的数据库产品
     */
    String getDbType();

    /**
     * 执行通配符SQL（SQL中包含#{key-name}，${key-name}）
     *
     * @param wildCharSQL 动态SQL （SQL中包含#{key-name}，${key-name}）
     * @param paramMap    sql参数map，其中key是动态SQL中的占位符内name
     */
    int executeWildCharSQL(String wildCharSQL, Map<String, Object> paramMap);

    /**
     * 执行标准DML SQL.
     *
     * @param sql    标准DML SQL，例如：update talbe set col1=? where col2=?
     * @param params 是sql动态绑定参数，顺序与sql中动态绑定符一致
     */
    int executeSQL(String sql, Object... params);

    /**
     * 执行批量 SQL
     *
     * @param sql      标准DML SQL，例如：update talbe set col1=? where col2=?
     * @param paramMap 是sql动态绑定参数，顺序与sql中动态绑定符一致
     */
    void executeBatch(String sql, List<Map<String, Object>> paramMap);

    /**
     * 采用通配符SQL查询单笔记录
     *
     * @param wildCharSQL 动态SQL （SQL中包含#{key-name}，${key-name}）
     * @param paramMap    sql参数map，其中key是动态SQL中的占位符内name
     */
    Map<String, Object> readRecord(String wildCharSQL, Map<String, Object> paramMap);

    /**
     * 标准SQL查询单笔记录
     *
     * @param sql    标准查询sql
     * @param params 参数列表
     */
    Map<String, Object> readRecord(String sql, Object... params);

    /**
     * 采用通配符SQL查询多笔（max size = QUERY_RECORD_MAX_SIZE）
     *
     * @param wildCharSQL 动态SQL （SQL中包含#{key-name}，${key-name}）
     * @param paramMap    sql参数map，其中key是动态SQL中的占位符内name
     */
    List<Map<String, Object>> queryGroup(String wildCharSQL, Map<String, Object> paramMap);

    /**
     * 采用通配符SQL查询多笔（max size = limit）
     *
     * @param wildCharSQL 动态SQL
     * @param limit       max size
     */
    List<Map<String, Object>> queryGroup(String wildCharSQL, int limit);

    /**
     * 采用标准SQL查询多笔（max size = QUERY_RECORD_MAX_SIZE）
     */
    List<Map<String, Object>> queryGroup(String sql);

    /**
     * 采用通配符SQL查询多笔（max size = QUERY_RECORD_MAX_SIZE）
     *
     * @param wildCharSQL 动态SQL （SQL中包含#{key-name}，${key-name}）
     * @param paramMap    sql参数map，其中key是动态SQL中的占位符内name
     */
    List<Map<String, Object>> queryGroup(String wildCharSQL, int limit, Map<String, Object> paramMap);


    /**
     * 采用通配符SQL 分页查询多笔
     *
     * @param wildCharSQL 动态SQL （SQL中包含#{key-name}，${key-name}）
     * @param pageNum     当前页
     * @param pageSize    显示条数
     * @param paramMap    sql参数map，其中key是动态SQL中的占位符内name
     * @return
     */
    PageInfo queryPage(String wildCharSQL, int pageNum, int pageSize, Map<String, Object> paramMap);

    /**
     * 采用标准SQL查询多笔（max size = limit）
     *
     * @param sql    标准查询sql
     * @param limit  查询笔数限制
     * @param params 参数数组
     */
    //public List<Map<String, Object>> queryGroup(String sql, Page limit, Object... params);

    /**
     * 为避免大查询将内存撑爆，查询多笔数据时，必须设置笔数限制
     *
     * @param sql   标准sql
     * @param limit 笔数限制
     */
    String sqlJoinLimit(String sql, int limit);

    /**
     * 查询总数
     *
     * @param sql    标准查询sql
     * @param params 参数数组
     * @return 总条数
     */
    int queryTotalCount(String sql, Object... params);

    /**
     * isDirt，true代表执行过insert/update/delete
     */
    boolean isDirt();

    /**
     * 重置isDirt
     * */
    void resetDirt();
}
